package ejb.casacentral.service.controller;

import java.io.FileNotFoundException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import comun.casacentral.proxy.ofiventa.solicitudCompra.ItemsSolicitudCompraXML;
import comun.casacentral.proxy.ofiventa.solicitudCompra.RodamientoSolicitudCompraXML;
import comun.casacentral.proxy.ofiventa.solicitudCompra.SolicitudOrdenCompraXML;
import comun.casacentral.proxy.parceador.UtilsXML;

import ejb.casacentral.log.CasaLogger;
import ejb.casacentral.persistence.entity.ItemRodamiento;
import ejb.casacentral.persistence.entity.OficinaVenta;
import ejb.casacentral.persistence.entity.Rodamiento;
import ejb.casacentral.persistence.entity.SolicitudCompra;

@SuppressWarnings("unchecked")
@Stateless
public class SolicitudControllerBean implements SolicitudController,
		Serializable {
	
	@EJB
	private RodamientoController rodamientoController;
	@EJB
	private OficinaVentaController oficinaVentaController;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@PersistenceContext(unitName = "casacentral")
	private EntityManager em;

	public SolicitudControllerBean() {

	}

	@Override
	public List<SolicitudCompra> obtenerSolicitudesDeCompra() {
		CasaLogger.log(" obteniendo entidad .... ");
		return  em.createNamedQuery("SolicitudCompra.todas").getResultList();
	}

	@Override
	public List<SolicitudCompra> obtenerSolicitudesDeCompraPendientes() {
		CasaLogger.log(" obteniendo entidad .... ");
		return  em.createNamedQuery("SolicitudCompra.pendientes").getResultList();
	}

	
	@Override
	public List<SolicitudCompra> obtenerSolicitudesDeCompraCompletas() {
		CasaLogger.log(" obteniendo entidad .... ");
		return  em.createNamedQuery("SolicitudCompra.completa").getResultList();
	}
	
	@Override
	public List<SolicitudCompra> obtenerSolicitudesPorCodigos(Set<String> codigosSolicitudes) {
		CasaLogger.log(" obteniendo entidad .... ");
		List<Long> codigos = new ArrayList<Long>();
		for (String codigo : codigosSolicitudes)
			codigos.add(Long.parseLong(codigo));
		
		return   em.createNamedQuery("SolicitudCompra.porCodigos").setParameter("codigos", codigos).getResultList();
	}
	
	@Override
	public SolicitudCompra obtenerSolicitudePorCodigo(String codigo) {
		CasaLogger.log(" obteniendo entidad .... ");
		return (SolicitudCompra)  em.createNamedQuery("SolicitudCompra.porCodigo").setParameter("codigo", codigo).getSingleResult();
	}

	@Override
	public SolicitudCompra generarSolicitudCompra(
			String xml) {
		
		SolicitudOrdenCompraXML solicitudXML = null;
		
		UtilsXML parcer= new UtilsXML();
		
		try {
			solicitudXML = parcer.toClase(xml, SolicitudOrdenCompraXML.class);
		
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		}
		
		OficinaVenta odv = oficinaVentaController.obtenerOficinaPorCodigo(String.valueOf(solicitudXML.getOdv()));
		if(odv==null){
			odv=oficinaVentaController.nuevoOficina(String.valueOf(solicitudXML.getOdv()));
		}

		SolicitudCompra solicitud = new SolicitudCompra();
		solicitud.setEstado("Pendiente");
		solicitud.setFechaRecepcion(new Date());
		solicitud.setOficinaVenta(odv);

		ItemsSolicitudCompraXML items = solicitudXML.getItems();

		for (RodamientoSolicitudCompraXML rod : items.getRodamiento()) {
			CasaLogger.log("obteniendo Rodamiento: "+rod.getCodigoRodamiento());
			Rodamiento rodEnt =  rodamientoController.obtenerRodamientoPorCodigo(rod.getCodigoRodamiento());
			ItemRodamiento ir = new ItemRodamiento(rodEnt, rod.getCantidad());
			solicitud.addRodamiento(ir);
		}

		 CasaLogger.log(" persistiendo entidad .... ");
		 solicitud = em.merge(solicitud);
		 em.flush();

		return solicitud;
	}



	

}
